"""
文件路由模块
处理文件上传、下载等操作
"""
from flask import Blueprint, request, jsonify, send_file, current_app
from flask_login import login_required, current_user
import os

from app.auth.decorators import handle_exceptions
from app.storage.manager import storage_manager
from app.storage.base import StorageType
from app.storage.exceptions import StorageError, FileNotFoundError

files_bp = Blueprint('files', __name__, url_prefix='/files')

@files_bp.route('/upload', methods=['POST'])
@login_required
@handle_exceptions
def upload_file():
    """
    文件上传
    """
    if 'file' not in request.files:
        return jsonify({
            'success': False,
            'error': '没有选择文件'
        }), 400
    
    file = request.files['file']
    
    if file.filename == '':
        return jsonify({
            'success': False,
            'error': '没有选择文件'
        }), 400
    
    # 获取上传参数
    folder = request.form.get('folder', '')
    metadata = {
        'uploaded_by': current_user.id,
        'uploaded_by_username': current_user.username
    }
    
    try:
        # 保存文件
        result = storage_manager.save(
            file, 
            file.filename, 
            folder=folder, 
            metadata=metadata
        )
        
        return jsonify({
            'success': True,
            'message': '文件上传成功',
            'file': result
        })
    
    except StorageError as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 400
    except Exception as e:
        current_app.logger.error(f"文件上传失败: {str(e)}")
        return jsonify({
            'success': False,
            'error': '文件上传失败'
        }), 500

@files_bp.route('/download/<file_id>')
@handle_exceptions
def download_file(file_id):
    """
    文件下载
    """
    try:
        # 获取文件
        file_obj = storage_manager.get(file_id)
        
        # 获取文件信息
        file_info = storage_manager.get_metadata(file_id)
        
        # 发送文件
        return send_file(
            file_obj,
            as_attachment=True,
            download_name=file_info.get('original_filename', file_id)
        )
    
    except FileNotFoundError:
        return jsonify({
            'success': False,
            'error': '文件不存在'
        }), 404
    except Exception as e:
        current_app.logger.error(f"文件下载失败: {str(e)}")
        return jsonify({
            'success': False,
            'error': '文件下载失败'
        }), 500

@files_bp.route('/<file_id>')
@handle_exceptions
def get_file(file_id):
    """
    获取文件信息
    """
    try:
        file_info = storage_manager.get_metadata(file_id)
        
        return jsonify({
            'success': True,
            'file': file_info
        })
    
    except FileNotFoundError:
        return jsonify({
            'success': False,
            'error': '文件不存在'
        }), 404
    except Exception as e:
        current_app.logger.error(f"获取文件信息失败: {str(e)}")
        return jsonify({
            'success': False,
            'error': '获取文件信息失败'
        }), 500

@files_bp.route('/<file_id>', methods=['DELETE'])
@login_required
@handle_exceptions
def delete_file(file_id):
    """
    删除文件
    """
    try:
        # 检查文件是否存在
        if not storage_manager.exists(file_id):
            return jsonify({
                'success': False,
                'error': '文件不存在'
            }), 404
        
        # 获取文件信息（检查权限）
        file_info = storage_manager.get_metadata(file_id)
        
        # 检查权限（上传者或管理员可以删除）
        uploaded_by = file_info.get('metadata', {}).get('uploaded_by')
        if (not current_user.is_admin and 
            str(uploaded_by) != str(current_user.id)):
            return jsonify({
                'success': False,
                'error': '无权删除此文件'
            }), 403
        
        # 删除文件
        success = storage_manager.delete(file_id)
        
        if success:
            return jsonify({
                'success': True,
                'message': '文件删除成功'
            })
        else:
            return jsonify({
                'success': False,
                'error': '文件删除失败'
            }), 500
    
    except Exception as e:
        current_app.logger.error(f"文件删除失败: {str(e)}")
        return jsonify({
            'success': False,
            'error': '文件删除失败'
        }), 500

@files_bp.route('/list')
@login_required
@handle_exceptions
def list_files():
    """
    列出文件
    """
    try:
        prefix = request.args.get('prefix', '')
        limit = request.args.get('limit', 50, type=int)
        
        files = storage_manager.list_files(prefix=prefix, limit=limit)
        
        return jsonify({
            'success': True,
            'files': files,
            'count': len(files)
        })
    
    except Exception as e:
        current_app.logger.error(f"列出文件失败: {str(e)}")
        return jsonify({
            'success': False,
            'error': '列出文件失败'
        }), 500

@files_bp.route('/storage/info')
@login_required
@handle_exceptions
def storage_info():
    """
    获取存储信息
    """
    try:
        info = storage_manager.get_storage_info()
        
        return jsonify({
            'success': True,
            'storage_info': info
        })
    
    except Exception as e:
        current_app.logger.error(f"获取存储信息失败: {str(e)}")
        return jsonify({
            'success': False,
            'error': '获取存储信息失败'
        }), 500